#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <cstdlib>
#include "Grafo.h"

int main( int argc, char* argv[] ){
    
    unsigned cantNodos,
             cantArcos,
             cantColores;
    
    ifstream archivoIN( argv[1] );
    //entrada
    archivoIN >> cantNodos;
    archivoIN >> cantArcos;
    
    /* Creo una matriz de adyacencia con un vector de vectores.
     * Como el problema de coloreo solo se aplica a grafos no
     * dirigidos, la matriz de adyacencia es simétrica, por lo
     * que solo necesito el triangulo superior o inferior de la
     * matriz para analizarla. En este caso tomo el triangulo
     * inferior.
     */
    
    vector< vector<unsigned> > adyacencia;
    
    //Esto es para no tener problemas con los indices.
    vector<unsigned> filaAdyacenciaNula ( 0 );
    adyacencia.push_back(filaAdyacenciaNula);
    adyacencia.push_back(filaAdyacenciaNula);
    
    for ( unsigned i = 1 ; i <= cantNodos ; i++){
        vector<unsigned> filaAdyacencia ( i + 1, 0 );
        adyacencia.push_back(filaAdyacencia);
    }

    unsigned nodoA,
             nodoB;
    
    for(unsigned arco = 0; arco < cantArcos; arco++){

        archivoIN >> nodoA;

        archivoIN >> nodoB;
        
        //Esto se hace asi porque solo tengo la triangular inferior.
        //cout << nodoA << " " << nodoB << endl;
        if ( nodoA > nodoB )           
            adyacencia[nodoA][nodoB] = 1;
        else
            adyacencia[nodoB][nodoA] = 1;
    }
    
    archivoIN.close();
    
    ifstream archivoOUT( argv[2] );
    
    archivoOUT >> cantColores;
    
    vector< vector<unsigned> > colores;
    vector<unsigned> colorNodes(0);
    
    colores.push_back(colorNodes);
    
    for ( unsigned i = 0 ; i < cantColores ; i++ ){
        unsigned colorActual,
                 cantNodos;
                 
        colores.push_back(colorNodes);
        
        archivoOUT >> colorActual;
        archivoOUT >> cantNodos;
        
        for ( unsigned j = 0 ; j < cantNodos ; j++ ){
            unsigned nodo;
            archivoOUT >> nodo;
            colores[colorActual].push_back(nodo);
        }
        
        
    }
       
    archivoOUT.close();
   
    
    for ( unsigned i = 0 ; i < cantColores ; i++ ){
               
        for ( unsigned j = 0 ; j < colores[i].size() ; j++ ){
                        
            for ( unsigned recActual = j + 1 ; recActual < colores[i].size() ; recActual++ ){
                
                unsigned nodoA = colores[i][j],
                         nodoB = colores[i][recActual];
                
                if ( nodoA > nodoB ){         
                    if ( adyacencia[nodoA][nodoB] == 1 )
                        cout << "El nodo " << nodoA 
                                << " es adyacente al nodo " << nodoB 
                                << "." << endl;
                }else{
                    if ( adyacencia[nodoB][nodoA] == 1 )
                        cout << "El nodo " << nodoA 
                                << " es adyacente al nodo " << nodoB 
                                << "." << endl;
                }
            }
        
        }
        
    }
    
    return 0;
}